<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script type="text/javascript">
        /* 
            当内部函数被返回到外部并保存时，一定产生闭包
            闭包会产生原来的作用域链不释放，过渡闭包会导致内存泄露或加载过慢
        */
        function test(num) {
            let n = arguments[0] || 10;

            function add() {
                n += 10;
                console.log(n);
            }

            function reduce() {
                n--;
                console.log(n);
            }
            return [add, reduce];
        }
        let arr = test(60);
        arr[0](); // 70
        arr[1](); // 69
        arr[1](); // 68
        arr[1](); // 67
        arr[1](); // 66
        arr[1](); // 65

        (function () {})(); //将函数转为表达式

        let num = (function (a, b) { // 将函数转为表达式
            return a + b;
        }(2, 6))
        console.log(num); // 8

        let num1 = function () { // 将函数转为表达式
            console.log(1); // 1
        }(); +
        function a() { // 将函数转为表达式
            console.log(123); // 123
        }();
        // 只有将函数声明为表达式才能立即执行

        // function num2(){
        //     console.log(2);
        // }(); // 报错

        function aaa(a){
            
        }(4); // 不会报错
        // 会将(4)变为表达式 而不是执行函数

        // 逗号运算 返回最后一个
        let aa = (1, 2, 3 + 4, 5 + 6);
        console.log(aa); // 11

        var a = 10;
        if(function b(){}){ // (function b(){}) 函数在小括号中会转为表达式，会直接忽略函数名 b是不存在的
            a += typeof(b); // typeof(b)-->typeof(undefined)-->undefined
        }
        console.log(a); // 10undefined
    </script>
</body>

</html>